using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._SpatialAnalystTools._Groundwater
{
    /// <summary>
    /// <para>Particle Track</para>
    /// <para>Calculates the path of a particle through a velocity field, returning an ASCII file of particle tracking data and, optionally, a feature class of track information.</para>
    /// <para>计算粒子通过速度场的路径，返回粒子跟踪数据的 ASCII 文件，以及轨迹信息的要素类（可选）。</para>
    /// </summary>    
    [DisplayName("Particle Track")]
    public class ParticleTrack : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ParticleTrack()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_direction_raster">
        /// <para>Input direction raster</para>
        /// <para><xdoc>
        ///   <para>An input raster where each cell value represents the direction of the seepage velocity vector (average linear velocity) at the center of the cell.</para>
        ///   <para>Directions are expressed in compass coordinates, in degrees clockwise from north. This can be created by the Darcy Flow tool.</para>
        ///   <para>Direction values must be floating point.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入栅格，其中每个像元值表示像元中心的渗流速度矢量（平均线速度）的方向。</para>
        ///   <para>方向以指南针坐标表示，从北开始顺时针方向表示。这可以通过 Darcy Flow 工具创建。</para>
        ///   <para>方向值必须为浮点数。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_in_magnitude_raster">
        /// <para>Input magnitude raster</para>
        /// <para><xdoc>
        ///   <para>An input raster where each cell value represents the magnitude of the seepage velocity vector (average linear velocity) at the center of the cell.</para>
        ///   <para>Units are length/time. This can be created by the Darcy Flow tool.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入栅格，其中每个像元值表示像元中心的渗流速度矢量（平均线速度）的大小。</para>
        ///   <para>单位是长度/时间。这可以通过 Darcy Flow 工具创建。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_source_point">
        /// <para>Source point</para>
        /// <para><xdoc>
        ///   <para>The location of the source point from which to begin the particle tracking.</para>
        ///   <para>This is entered as numbers identifying the x,y coordinates of the position in map units.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要从中开始粒子跟踪的源点的位置。</para>
        ///   <para>这以数字的形式输入，以地图单位标识位置的 x，y 坐标。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_track_file">
        /// <para>Output particle track file</para>
        /// <para>The output ASCII text file that contains the particle tracking data.</para>
        /// <para>包含粒子跟踪数据的输出 ASCII 文本文件。</para>
        /// </param>
        public ParticleTrack(object _in_direction_raster, object _in_magnitude_raster, object _source_point, object _out_track_file)
        {
            this._in_direction_raster = _in_direction_raster;
            this._in_magnitude_raster = _in_magnitude_raster;
            this._source_point = _source_point;
            this._out_track_file = _out_track_file;
        }
        public override string ToolboxName => "Spatial Analyst Tools";

        public override string ToolName => "Particle Track";

        public override string CallName => "sa.ParticleTrack";

        public override List<string> AcceptEnvironments => ["MDomain", "MResolution", "MTolerance", "XYDomain", "XYResolution", "XYTolerance", "ZDomain", "ZResolution", "ZTolerance", "autoCommit", "cellSize", "cellSizeProjectionMethod", "configKeyword", "extent", "geographicTransformations", "maintainSpatialIndex", "outputCoordinateSystem", "outputMFlag", "outputZFlag", "outputZValue", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_direction_raster, _in_magnitude_raster, _source_point, _out_track_file, _step_length, _tracking_time, _out_track_polyline_features];

        /// <summary>
        /// <para>Input direction raster</para>
        /// <para><xdoc>
        ///   <para>An input raster where each cell value represents the direction of the seepage velocity vector (average linear velocity) at the center of the cell.</para>
        ///   <para>Directions are expressed in compass coordinates, in degrees clockwise from north. This can be created by the Darcy Flow tool.</para>
        ///   <para>Direction values must be floating point.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入栅格，其中每个像元值表示像元中心的渗流速度矢量（平均线速度）的方向。</para>
        ///   <para>方向以指南针坐标表示，从北开始顺时针方向表示。这可以通过 Darcy Flow 工具创建。</para>
        ///   <para>方向值必须为浮点数。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input direction raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_direction_raster { get; set; }


        /// <summary>
        /// <para>Input magnitude raster</para>
        /// <para><xdoc>
        ///   <para>An input raster where each cell value represents the magnitude of the seepage velocity vector (average linear velocity) at the center of the cell.</para>
        ///   <para>Units are length/time. This can be created by the Darcy Flow tool.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入栅格，其中每个像元值表示像元中心的渗流速度矢量（平均线速度）的大小。</para>
        ///   <para>单位是长度/时间。这可以通过 Darcy Flow 工具创建。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input magnitude raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_magnitude_raster { get; set; }


        /// <summary>
        /// <para>Source point</para>
        /// <para><xdoc>
        ///   <para>The location of the source point from which to begin the particle tracking.</para>
        ///   <para>This is entered as numbers identifying the x,y coordinates of the position in map units.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要从中开始粒子跟踪的源点的位置。</para>
        ///   <para>这以数字的形式输入，以地图单位标识位置的 x，y 坐标。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Source point")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _source_point { get; set; }


        /// <summary>
        /// <para>Output particle track file</para>
        /// <para>The output ASCII text file that contains the particle tracking data.</para>
        /// <para>包含粒子跟踪数据的输出 ASCII 文本文件。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output particle track file")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_track_file { get; set; }


        /// <summary>
        /// <para>Step length</para>
        /// <para><xdoc>
        ///   <para>The step length to be used for calculating the particle track.</para>
        ///   <para>The default is one-half the cell size. Units are length.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于计算粒子轨迹的步长。</para>
        ///   <para>默认值为单元格大小的一半。单位是长度。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Step length")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _step_length { get; set; } = null;


        /// <summary>
        /// <para>Tracking time</para>
        /// <para><xdoc>
        ///   <para>Maximum elapsed time for particle tracking.</para>
        ///   <para>The algorithm will follow the track until either this time is met or the particle migrates off the raster or into a depression.</para>
        ///   <para>The default value is infinity. Units are time.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>粒子跟踪的最长时间。</para>
        ///   <para>该算法将跟踪轨迹，直到满足此时间或粒子从栅格迁移或进入凹陷。</para>
        ///   <para>默认值为 infinity。单位就是时间。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Tracking time")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _tracking_time { get; set; } = null;


        /// <summary>
        /// <para>Output track polyline features</para>
        /// <para><xdoc>
        ///   <para>The optional output line feature class containing the particle track.</para>
        ///   <para>This feature class contains a series of arcs with attributes for position, local velocity direction and magnitude, and cumulative length and time of travel along the path.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>包含粒子轨迹的可选输出线要素类。</para>
        ///   <para>此要素类包含一系列弧线，这些弧线具有位置、局部速度方向和大小以及沿路径行驶的累积长度和时间属性。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output track polyline features")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_track_polyline_features { get; set; } = null;


        public ParticleTrack SetEnv(object MDomain = null, object MResolution = null, object MTolerance = null, object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZDomain = null, object ZResolution = null, object ZTolerance = null, int? autoCommit = null, object cellSize = null, object configKeyword = null, object extent = null, object geographicTransformations = null, bool? maintainSpatialIndex = null, object outputCoordinateSystem = null, object outputMFlag = null, object outputZFlag = null, object outputZValue = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(MDomain: MDomain, MResolution: MResolution, MTolerance: MTolerance, XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZDomain: ZDomain, ZResolution: ZResolution, ZTolerance: ZTolerance, autoCommit: autoCommit, cellSize: cellSize, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, maintainSpatialIndex: maintainSpatialIndex, outputCoordinateSystem: outputCoordinateSystem, outputMFlag: outputMFlag, outputZFlag: outputZFlag, outputZValue: outputZValue, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}